package ar.com.logic.components.strategy;

import java.util.List;
import java.util.Vector;

import ar.com.logic.components.CoordenadasFijos;
import ar.com.logic.components.Numero;
import ar.com.logic.components.interfaces.IHistoricoRespuestas;
import ar.com.logic.components.interfaces.IMatrizPosiciones;
import ar.com.logic.evaluador.Respuesta;

public class Estrategia3B0C extends Estrategia {
	private Integer pibote;
	private Integer reemplazado;
	private Integer posicionReemplazo;
	private boolean ejecutada;

	public Estrategia3B0C(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {
		super(matriz, historico);
		this.ejecutada = false;
	}

	public Numero getSiguienteNumero() {
		Numero n = new Numero();
		Respuesta r = historicoRespuestas.obtenerUltimaRespuesta();
		n.agregarDigito(r.getNumero().get(0));
		n.agregarDigito(r.getNumero().get(1));
		n.agregarDigito(r.getNumero().get(2));
		reemplazado = r.getNumero().get(3);
		posicionReemplazo = 4;

		List<Integer> disponibles = matriz.obtenerDisponibles();
		pibote = disponibles.get(0);
		n.agregarDigito(pibote);
		this.ejecutada = true;

		return n;
	}

	public String getNombre() {
		// TODO Auto-generated method stub
		return IEstrategia.TRESB0C;
	}

	@Override
	public void actualizarPorRespuestaEsperada(Respuesta r) {

		if (r.getCorrectos() == 3) {
			for (int i = 1; i <= matriz.getMaxPosiciones(); i++) {
				if (r.getNumero().get(i - 1) != pibote) {
					matriz.fijarValorParaPosicion(r.getNumero().get(i - 1), i);
				} else {
					matriz.descartarValor(pibote);
				}
			}
			matriz.descartarValor(reemplazado);
		} else if (r.getCorrectos() == 2 && r.getRegulares() == 0) {
			matriz.descartarValor(pibote);
			matriz.fijarValorParaPosicion(reemplazado, posicionReemplazo);
		} else if (r.getCorrectos() == 2 && r.getRegulares() == 1) {
			matriz.agregarAConocidos(pibote, 0);
			matriz.fijarValorParaPosicion(reemplazado, posicionReemplazo);
		}
	}

	@Override
	public List<Respuesta> getRespuestasEsperadas() {
		List<Respuesta> respuestas = new Vector<Respuesta>();
		Respuesta r = new Respuesta();
		r.addCorrectos();
		r.addCorrectos();
		r.addCorrectos();
		respuestas.add(r);
		r = new Respuesta();
		r.addCorrectos();
		r.addCorrectos();
		respuestas.add(r);
		r.addCorrectos();
		r.addCorrectos();
		r.addRegular();
		respuestas.add(r);
		return respuestas;

	}

	@Override
	public boolean esCondicionEsperada(IMatrizPosiciones matriz,
			IHistoricoRespuestas historico) {

		return historico.obtenerUltimaRespuesta() != null
				&& historico.obtenerUltimaRespuesta().getCorrectos() == 3
				&& matriz.obtenerFijos().getCantidadFijos() <= 1;

	}

	@Override
	public Integer getPriority() {

		return 10;
	}

	@Override
	public boolean esUnicaEjecucion() {
		// TODO Auto-generated method stub
		return true;
	}

	@Override
	public boolean estaDescartada() {
		// TODO Auto-generated method stub
		return this.ejecutada;
	}

}
